//  用户有登录需求
// 用户会先访问 /login

import Koa from "./koa/lib/application.js";
import path from "path";
import serve from "./middleware/serve.js";
import Router from "./middleware/router.js";
import bodyParser from "./middleware/bodyParser.js";
import view from "./middleware/views.js";
// import Koa from "koa";
const app = new Koa();
const router = new Router();

// 1.内部会将提供的函数，进行组合 ，组合成一个promise， 只要 在promise范围 内报错都可以捕获
// 2.记录访问的时间,以及错误都可以统一捕获
// 3.中间件可以直接扩充公共的逻辑,
// 4.中间件可以决定是否向下执行
// 配置多个
app.use(serve(import.meta.dirname));
app.use(serve(path.resolve(import.meta.dirname, "middleware")));
app.use(bodyParser({uploadDir:path.resolve(import.meta.dirname,'upload')})); // ctx.request.body = 请求体
app.use(async function (ctx, next) {
  console.time("ok");
  await next();
  console.timeEnd("ok");
});
app.use(async function (ctx, next) {
  await next().catch((err) => {
    console.log(err, 14);
  });
});
app.use(
  view({
    ext: ".html",
    dirname: path.resolve(import.meta.dirname, "views"),
  })
);
app.use(router.routes()); // 在应用中使用路由系统
router.post("/login", async (ctx, next) => {
  console.log(ctx.request.body)
  ctx.body = "login";
});

router.get("/user", async (ctx, next) => {
  // render方法是异步的
   await ctx.render('user',{name:'jw'})
});
app.use((ctx, next) => {
  console.log("next");
});

// 模板实现原理 
// 文件如何上传 (1.选择文件 2.formData  服务端处理的时候都是通过multipart-formdata)

// app.use(function (ctx, next) {
//   console.log(ctx.path, ctx.method);
//   if (ctx.path === "/login" && ctx.method === "POST") {
//     console.log('---')
//     ctx.req.on("data", function (chunk) {
//       console.log(chunk);
//     });
//   }
// });

// app.on("error", function (err) {
//   console.log(err, "---");
// });

app.listen(3000, function () {
  console.log("server start 3000");
});

// app.use(async function (ctx, next) {
//   if(ctx.path === '/login.html' && ctx.method === 'GET'){
//     ctx.response.set('Content-Type','text/html'); // setHeader
//     ctx.body = createReadStream(path.resolve(import.meta.dirname,'./login.html'));
//   }
// });
